package modelo;

import java.util.concurrent.Semaphore;

public class SMailbox implements Channel {
   private Object message = null;
   private final Object sending = new Object();
   private final Object receiving = new Object();
   private final Semaphore sent = new Semaphore(0);
   private final Semaphore received = new Semaphore(0);
   
   //envia uma mensagem
   public void send(Object msg) {
      synchronized (sending) {
         message = msg;  //armazena a mensagem no buffer
         sent.release(); //sinaliza que uma mensagem esta disponivel
         //espera ate a mensagem ser recebida
         try { received.acquire(); } catch (InterruptedException e) {} //tratar excecao
      }
   }
   
   //recebe uma mensagem
   public Object receive() {
      Object receivedMsg = null;
      synchronized(receiving) {
         //espera por uma mensagem 
         try { sent.acquire(); } catch (InterruptedException e) {} //tratar excecao
         receivedMsg = message;  //recebe a mensagem
         received.release();  //sinaliza que a mensagem foi recebida
      }
      return receivedMsg;
   }
}
